﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using System.Data.Common;

namespace CityGames
{
    public class Promocion
    {
        static private CADPromocion cadPromocion = new CADPromocion();

        private string nombre;
        private int tipoDescuento;
        private decimal cantidadDescuento;
        private DateTime fechaInicio;
        private DateTime fechaFin;

        public string Nombre
        {
            get { return nombre; }
            set { nombre = value; }
        }

        public int TipoDescuento
        {
            get { return tipoDescuento; }
            set { tipoDescuento = value; }
        }

        public decimal CantidadDescuento
        {
            get { return cantidadDescuento; }
            set { cantidadDescuento = value; }
        }
        
        public DateTime FechaInicio
        {
            get { return fechaInicio; }
            set { fechaInicio = value; }
        }
        
        public DateTime FechaFin
        {
            get { return fechaFin; }
            set { fechaFin = value; }
        }

        public Promocion()
        {
            nombre = "";
            tipoDescuento =0;
            cantidadDescuento = 0;
            fechaInicio=DateTime.Today;
            fechaFin=DateTime.Today;
        }

        public bool InsertarPromocion()
        {
            bool resultado = false;

            try
            {
                resultado = cadPromocion.InsertarPromocion(nombre, tipoDescuento, cantidadDescuento, fechaInicio, fechaFin);
            }
            catch(Exception ex)
            {
                throw ex;
            }

            return resultado;
        }

        public bool ActualizarPromocion()
        {
            bool resultado = false;

            try
            {
                resultado = cadPromocion.ActualizarPromocion(nombre, tipoDescuento, cantidadDescuento, fechaInicio, fechaFin);
            }
            catch (Exception ex)
            {
                throw ex;
            }

            return resultado;
        }

        public DateTime ObtenerFechaMinima()
        {
            DateTime resultado;

            try
            {
                resultado = cadPromocion.ObtenerFechaMinima();
            }
            catch (Exception ex)
            {
                throw ex;
            }

            return resultado;
        }

        public DateTime ObtenerFechaMaxima()
        {
            DateTime resultado;

            try
            {
                resultado = cadPromocion.ObtenerFechaMaxima();
            }
            catch (Exception ex)
            {
                throw ex;
            }

            return resultado;
        }

        public int ObtenerNumeroDePromocionesFiltradas(string nombre, int tipoDescuento, DateTime fechaInicio, DateTime fechaFin)
        {
            int resultado = 0;

            try
            {
                resultado = cadPromocion.ObtenerNumeroDePromocionesFiltradas(nombre, tipoDescuento, fechaInicio, fechaFin);
            }
            catch (Exception ex)
            {
                throw ex;
            }

            return resultado;
        }

        public DataSet ObtenerPromocionesFiltradas(string nombre, int tipoDescuento, DateTime fechaInicio, DateTime fechaFin, int desde, int hasta)
        {
            DataSet resultado = new DataSet();

            try
            {
                resultado = cadPromocion.ObtenerPromocionesFiltradas(nombre, tipoDescuento, fechaInicio, fechaFin, desde, hasta);
            }
            catch (Exception ex)
            {
                throw ex;
            }

            return resultado;
        }

        /// <summary>
        /// Obtiene el codigo numerico que identifica a una promoción
        /// </summary>
        /// <returns>Devuelve un valor entero con el codigo de promocion</returns>
        public int ObtenerCodigoProm()
        {
            int resultado = 0;

            try
            {
                resultado = cadPromocion.ObtenerCodigoProm(nombre);
            }
            catch (Exception ex)
            {
                throw ex;
            }

            return resultado;
        }

        /************************************************** Funciones de Marcos **************************************************/

        /// <summary>
        /// Funcion para comprobar si existe una promocion con el nombre especificado por parámetro en la Base de Datos
        /// </summary>
        /// <param name="nombrePromocion">
        /// Nombre de la promocion que se desea comprobar su existencia en la Base de Datos</param>
        /// <returns>
        /// Devuelve True en caso de que exista una promocion con el nombre especificado en la Base de Datos, False en caso contrario</returns>
        public bool ExistePromocion(string nombrePromocion)
        {
            bool resultado = false;

            try
            {
                resultado = cadPromocion.ExistePromocion(nombrePromocion);
            }
            catch (Exception ex)
            {
                throw ex;
            }

            return resultado;
        }

        /// <summary>
        /// Funcion para actualizar en modo desconectado las promociones de la Base de Datos
        /// </summary>
        /// <param name="dsPromociones">
        /// DataSet en donde se encuentran las promociones modificadas, cuyos cambios se desean reflejar en la Base de Datos</param>
        /// <param name="nombre">
        /// Nombre de la promocion, necesario para reconstruir la select original</param>
        /// <param name="tipoDescuento">
        /// Tipo de descuento (0 = Todos, 1 = Descuento por euros, 2 = Descuento por porcentaje, 3 = Descuento 2x1)</param>
        /// <param name="fechaInicio">
        /// Fecha de inicio de la promocion</param>
        /// <param name="fechaFin">
        /// Fecha de fin de la promocion</param>
        /// <param name="desde">
        /// Desde qué fila de la Base de Datos se había consultado</param>
        /// <param name="hasta">
        /// Hasta qué fila de la Base de Datos se había consultado</param>
        /// <returns>
        /// Devuelve True en caso de que no se haya producido ningún error, Fasle en caso contrario</returns>
        public bool ActualizarPromociones(DataSet dsPromociones, string nombre, int tipoDescuento, DateTime fechaInicio, DateTime fechaFin, int desde, int hasta)
        {
            bool resultado = false;

            try
            {
                resultado = cadPromocion.ActualizarPromociones(dsPromociones, nombre, tipoDescuento, fechaInicio, fechaFin, desde, hasta);
            }
            catch (Exception ex)
            {
                throw ex;
            }

            return resultado;
        }

        /// <summary>
        /// Funcion para obtener los datos de la promocion correspondiente al codigo pasado como parámetro
        /// </summary>
        /// <param name="codigoPromocion">
        /// Código de la promocion de la cual se desean obtener los datos</param>
        /// <returns>
        /// Devuelve un DataSet con los datos de la promocion en una tabla llamada "DatosPromocion"</returns>
        public DataSet ObtenerDatosPromocion(int codigoPromocion)
        {
            DataSet resultado = new DataSet();

            try
            {
                resultado = cadPromocion.ObtenerDatosPromocion(codigoPromocion);
            }
            catch (Exception ex)
            {
                throw ex;
            }

            return resultado;
        }

        /************************************************** Fin Funciones de Marcos **************************************************/

        /************************************************** Funciones de Ruben ******************************************************/

        /// <summary>
        /// Función que devuelve el tipo de descuento que tiene un juego y su valor
        /// </summary>
        /// <param name="nombrejuego">
        /// El nombre del juego.</param>
        /// <param name="plataforma">
        /// La plataforma del juego.</param>
        /// <returns>
        /// Un vector de strings que contiene el tipo de descuento y su valor</returns>
        public string[] GetTipoPromocion(string nombreJuego, string plataforma)
        {
            string[] promo;

            try
            {
                promo = cadPromocion.GetTipoPromocion(nombreJuego, plataforma);
            }
            catch (Exception ex)
            {
                throw ex;
            }

            return promo;
        }

        /************************************************** Fin Funciones de Ruben **************************************************/
    }
}
